﻿using System.Collections.Generic;

//
// Created by Arosy on 2021/11/22.
//

//
// Created by Arosy on 2021/11/22.
//

public class ConstantPool:FileC
{
	public byte[] tag;
	public SortedDictionary<int, object> data = new SortedDictionary<int, object>();


	//#pragma comment(lib, "wsock32.lib")
	/**
	 * 根据JVM指令中的操作数 获取常量池中的类的全限定名
	 * @param index
	 * @return
	 */
	public string getClassNameByFieldInfo(ushort index)
	{
		int i = htonl((int)data[index]); //取出索引
		int classIndex = i >> 16; // 取出i的左16位
		//获取class全限定名
		int classNameIndex = (int)data[classIndex]; //取出类名的索引
		return (string)(data[classNameIndex]); // 返回类名
	}


	/**
	 * 根据JVM指令中的操作数 获取常量池中的类的属性名
	 * @param index
	 * @return
	 */
	public string getFieldName(ushort index)
	{
		int i = htonl((int)data[index]); //取出索引
		int ind = i & 0xFF; // 取出i的右16位
		int nameAndType = htonl((int)data[ind]); // 取出nameAndType的索引
		int t = nameAndType >> 16; // 取nameAndType的索引 的左16位
		return (string)(data[t]); // 返回变量名
	}

	/**
	 * 根据JVM指令中的操作数 获取常量池中的一个字符串
	 * @param index
	 * @return
	 */
	public string getStringFromPool(ushort index)
	{
		return (string)(data[index]);
	}

	/**
	 * 根据JVM指令中的操作数 获取常量池中的一个字符串 并且 重新在堆中分配内存（复制一份）
	 * @param index
	 * @return
	 */
	public string getAndNewFromPool(ushort index)
	{
		string temp = getStringFromPool(index);
        //string res = new string(new char[temp.Length - 1]);
        //temp.copy(res, temp.Length, 0);
        //res = StringFunctions.ChangeCharacter(res, temp.Length, '\0');
        //return (string)(data[index]);
        string res = temp + "\0";
        return res;
    }

	/**
	 * 根据JVM指令中的操作数 获取常量池中类的全限定名
	 * @param index
	 * @return
	 */
	public string getClassPath(ushort index)
	{
		int ind = (int)(data[index]);
		return (string)data[ind];
	}

	/**
	 * 根据JVM指令中的操作数 获取常量池中方法的名字
	 * @param index
	 * @return
	 */
	public string getMethodNameByMethodInfo(ushort index)
	{
		int i = htonl((int)data[index]);
		int nameAndTypeIndex = i & 0xff;
		int d = htonl((int)data[nameAndTypeIndex]);
		i = d >> 16;
		return (string)(data[i]);
	}

	/**
	 * 根据JVM指令中的操作数 获取常量池中方法的描述（参数与返回值的描述）
	 * @param index
	 * @return
	 */
	public string getDescriptorNameByMethodInfo(ushort index)
	{
		int i = htonl((int)data[index]);
		int nameAndTypeIndex = i & 0xff;
		int d = htonl((int)data[nameAndTypeIndex]);
		i = d & 0xff;
		return (string)(data[i]);
	}

	/**
	 * 根据JVM指令中的操作数 获取常量池中类的全限定名
	 * @param index
	 * @return
	 */
	public string getClassNameByMethodInfo(ushort index)
	{
		return getClassNameByFieldInfo(index);
	}


}